package br.com.foxinline.manager.historico;

import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.Cidade;
import br.com.foxinline.servico.BairroServico;
import br.com.foxinline.servico.historico.BairroHistoricoServico;
import br.com.foxinline.util.Msg;
import br.com.foxinline.vo.CamposVO;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerHistoricoBairro {

    @EJB
    BairroServico bairroServico;
    @EJB
    BairroHistoricoServico bairroHistoricoServico;
    private List<Bairro> bairroHistoricos;
    private String historicoId;
    private Bairro bairroHistorico;
    private Bairro bairroHistoricoComparar;
    private Cidade visualizarCidade;
    private List<CamposVO> campos;
    private Bairro bairroRestaurar;

    @PostConstruct
    public void init() {
        this.bairroRestaurar = new Bairro();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.historicoId = params.get("historico");
        paramPost();
    }

    public void paramPost() {
        try {
            if (this.historicoId != null) {
                this.bairroHistoricos = this.bairroHistoricoServico.history(Long.parseLong(this.historicoId));
            }
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    /**
     * Compara se os campos do parâmetro bairro são diferentes do seu antecessor
     * na lista de bairros do histórico. Grava os campos e os seus valores para
     * exibição
     *
     * <br/> <p> <b>Author:</b> Diego Laverson</p>
     *
     * @param bairro
     */
    public void comparar(Bairro bairro) {

        int index = this.bairroHistoricos.indexOf(bairro);

        if (index == this.bairroHistoricos.size() - 1) {
            this.bairroHistoricoComparar = this.bairroServico.find(Long.parseLong(this.historicoId));
        } else {
            this.bairroHistoricoComparar = this.bairroHistoricos.get(index + 1);
        }

        this.bairroHistorico = (Bairro) this.bairroHistoricoServico.comparar(bairro, this.bairroHistoricoComparar, false);
        this.bairroHistorico.setDataAtualizacao(bairro.getDataAtualizacao());

        this.campos = this.bairroHistoricoServico.getCampos();
    }

    /**
     * Restaura os dados que foram modificados com relação ao
     * <b>bairroRestaurar</b> e o bairro que está sendo verificado o histórico
     *
     * <br/> <p> <b>Author:</b> Diego Laverson</p>
     */
    public void restaurar() {
        try {

            Bairro bairro = this.bairroServico.find(Long.parseLong(this.historicoId));

            bairro = (Bairro) this.bairroHistoricoServico.comparar(this.bairroRestaurar, bairro, true);
            
            bairroServico.update(bairro);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public Cidade getVisualizarCidade() {
        return visualizarCidade;
    }

    public void setVisualizarCidade(Cidade visualizarCidade) {
        this.visualizarCidade = visualizarCidade;
    }

    public List<Bairro> getBairroHistoricos() {
        return bairroHistoricos;
    }

    public void setBairroHistoricos(List<Bairro> historico) {
        this.bairroHistoricos = historico;
    }

    public Bairro getBairroHistoricoComparar() {
        return bairroHistoricoComparar;
    }

    public void setBairroHistoricoComparar(Bairro bairroHistoricoComparar) {
        this.bairroHistoricoComparar = bairroHistoricoComparar;
    }

    public List<CamposVO> getCampos() {
        return campos;
    }

    public void setCampos(List<CamposVO> campos) {
        this.campos = campos;
    }

    public Bairro getBairroRestaurar() {
        return bairroRestaurar;
    }

    public void setBairroRestaurar(Bairro bairroRestaurar) {
        this.bairroRestaurar = bairroRestaurar;
    }

    public Bairro getBairroHistorico() {
        return bairroHistorico;
    }

    public void setBairroHistorico(Bairro bairroHistorico) {
        this.bairroHistorico = bairroHistorico;
    }
}
